import { adminRoute, chargeSettleRoute, cityServiceRoute, elevatorRoute, financeRoute, fitOldRoute } from '@/router/routes'
import { wujieRouteDict } from '@/router/wujie'
import { useMessage } from '@fl/hooks/web/use-message'
import { getDistrict } from '@fl/logics/authentication'
import { useUserStoreWithOut } from '@fl/store/modules/user'
import { cloneDeep, intersection, uniqBy } from 'lodash-es'

const districtObj  = {
    "420100000000": "武汉好房",
    "429006000000": "天门好房",
}
export const bussinessTypeEnum = {
    1: {
        label: '保租房',
        path: '/lease',
        remark: '租赁企业',
    },
    2: {
        label: '武汉好房',
        path: '/good-house',
        remark: '好房企业',
    },
    4: {
        label: '城市服务',
        path: '/city',
        remark: '城市服务企业',
    },
    7: {
        label: '金融服务',
        path: '/finance',
        remark: '金融机构',
    },
    // 8是房交会, 房交会也要跳到武汉好房去
    8: {
        label: '武汉好房',
        path: '/good-house',
        remark: '好房企业',
    },
    9: {
        label: '适老化',
        path: '/fit-old',
        remark: '适老化企业',
    },
    10: {
        label: '电梯加装',
        path: '/retrofit-elevator',
        remark: '电梯加装业务',
    },
    11: {
        label: '充电结算',
        path: '/charge-settle',
        remark: '清分业务',
    },
    12: {
        label: '危旧改',
        path: '/good-house',
        remark: '危旧改业务',
    },

} as const

export function compositeMenuByEnterpriseType() {
    const bussinessTypeList = calcBussinessTypeList()
    const menuList = [] as any[]
    bussinessTypeList.forEach((bussinessType) => {
        if (bussinessTypeEnum[bussinessType])
            menuList.push(bussinessTypeEnum[bussinessType])
    })

    const userStore = useUserStoreWithOut()
    // 好房暂时能看到合同、印章：2好房、12危旧改
    if (userStore.getOrgInfo?.catTypeId.includes('2') && !userStore.getOrgInfo?.catTypeId.includes('12') && userStore.getOrgInfo?.contractFlag === 1) {
        menuList.push({
            label: '系统设置',
            path: '/admin',
        })
    }

    const uniqueMenuList = uniqBy(menuList, 'label')
    // 强行将好房排在第一位优先走新逻辑
    const itemToMove = uniqueMenuList.find(item => item.label === '武汉好房')
    if (itemToMove) {
        itemToMove.label = districtObj[getDistrict()]
        uniqueMenuList.splice(uniqueMenuList.indexOf(itemToMove), 1)
        uniqueMenuList.unshift(itemToMove)
    }
    return uniqueMenuList
}

export function generateRoutesByEnterpriseType(): AppRouteRecordRaw[] {
    const bussinessTypeList = calcBussinessTypeList()
    const routes = [] as AppRouteRecordRaw[]

    bussinessTypeList.forEach((bussinessType) => {
        if (wujieRouteDict[bussinessType])
            routes.push(...wujieRouteDict[bussinessType])
    })

    const userStore = useUserStoreWithOut()
    // 此处根据企业信息的字段，添加系统配置（目前有合同模板、印章管理）
    if (userStore.getOrgInfo?.contractFlag === 1 || userStore.getOrgInfo?.catTypeId.includes('2')) {
        routes.push(adminRoute)
    }

    const result = cloneDeep(routes)

    // 根据企业类型字段计算适老化最终路由
    const enterpriseTypeName = userStore.getOrgInfo?.enterpriseTypeName ?? ''
    // 暂时先判断金融机构，后判断适老化
    if (enterpriseTypeName === '金融机构') {
        const financeRoute = generateFinanceRouteByQiylx(enterpriseTypeName)
        if (financeRoute) {
            result.push(financeRoute)
        }
    }
    else if (enterpriseTypeName === '运营商(清分业务)' || enterpriseTypeName === '设备商(清分业务)') {
        const finalSettleRoute = generateSettleRouteByQiylx(enterpriseTypeName)
        if (finalSettleRoute) {
            result.push(finalSettleRoute)
        }
    }
    else if (enterpriseTypeName === '生活商城商家') {
        result.push(cityServiceRoute)
    }
    else if (enterpriseTypeName.includes('电梯加装')) {
        const finalElevatorRoute = generateElevatorRouteByQiylx(enterpriseTypeName)
        if (finalElevatorRoute) {
            result.push(finalElevatorRoute)
        }
    }
    else {
        const checkWy = userStore.getOrgInfo?.checkWy ?? ''
        let finalFitOldRoute = generateFitOldRouteByQiylx(enterpriseTypeName)
        if (enterpriseTypeName === '物业公司' && checkWy) {
            finalFitOldRoute = generateFitOldRouteByQiylx('物业联系人')
        }
        if (finalFitOldRoute) {
            result.push(finalFitOldRoute)
        }
    }
    console.log(result, 'result')

    return result
}

function generateFitOldRouteByQiylx(enterpriseTypeName) {
    if (enterpriseTypeName) {
        let permissionStrList: string[] = []
        // 特殊判断：同时包含物业公司、施工单位
        if (enterpriseTypeName.includes('施工单位')) {
            permissionStrList = fitOldPermissionsDict['施工单位'] as string[]
        }
        else {
            permissionStrList = fitOldPermissionsDict[enterpriseTypeName] as string[]
        }
        console.log('permissionStrList', permissionStrList, fitOldRoute)
        if (permissionStrList?.length) {
            const calcChildren = fitOldRoute.children.filter((item) => {
                // 求交集
                const inter = intersection(permissionStrList, item.meta?.permission)
                if (inter.length) {
                    return true
                }
                return false
            })

            const finalRoute = {
                ...fitOldRoute,
                children: calcChildren, // 重写子孙
                redirect: { name: calcChildren?.[0]?.name }, // 重写重定向
            }
            return finalRoute
        }
    }

    return null
}

function generateElevatorRouteByQiylx(enterpriseTypeName) {
    const elevatorRouteCopy = cloneDeep(elevatorRoute)
    if (enterpriseTypeName) {
        let permissionStrList: string[] = []
        const userStore = useUserStoreWithOut()
if(userStore.getOrgInfo?.areaCode==='429006000000'){//天门专区 --菜单不同
    permissionStrList = (areaElevatorPermissionsDict[enterpriseTypeName] as string[])

}else{
           if (userStore.getOrgInfo?.enterpriseAccount != '4201' && enterpriseTypeName == '市住更局(电梯加装)') {
            {
                permissionStrList = elevatorPermissionsDict['区住更局(电梯加装)'] as string[]
            }
        }
        else {
            permissionStrList = elevatorPermissionsDict[enterpriseTypeName] as string[]
        } 
}

        if (permissionStrList?.length) {
            const calcChildren = getElevatorRoute(elevatorRouteCopy.children, permissionStrList)
            const finalRoute = {
                component: elevatorRouteCopy.component,
                name: 'retrofit-elevator',
                path: '/retrofit-elevator',
                meta: { title: '加装电梯' },
                children: calcChildren, // 重写子孙
                redirect: { name: calcChildren?.[0]?.children?.[0]?.name },
            }
            return finalRoute
        }
    }
}

function getElevatorRoute(asyncRouterMap: any, permissionStrList) {
    // console.log('asyncRouterMap11', asyncRouterMap, typeof(asyncRouterMap))
    const accessedRouters = asyncRouterMap.filter((route) => {
        // access.push(route.path)
        // route.meta = route.meta;
        // route.name = route.name;
        // route.path = route.path
        // route.component = route.component
        if (route.children && route.children.length) {
            route.children = getElevatorRoute(route.children, permissionStrList)
        }
        const inter = intersection(permissionStrList, route.meta?.permission)
        if (inter.length) {
            return true
        }
        // console.log('access', access)
        return false
    })
    return accessedRouters
}

// 金融机构
function generateFinanceRouteByQiylx(enterpriseTypeName) {
    if (enterpriseTypeName) {
        const permissionStrList = financePermissionsDict[enterpriseTypeName] as string[]
        if (permissionStrList?.length) {
            const calcChildren = financeRoute.children.filter((item) => {
                // 求交集
                const inter = intersection(permissionStrList, item.meta?.permission)
                if (inter.length) {
                    return true
                }
                return false
            })

            const finalRoute = {
                ...financeRoute,
                children: calcChildren, // 重写子孙
                redirect: { name: calcChildren?.[0]?.name }, // 重写重定向
            }
            return finalRoute
        }
    }

    return null
}

// 充电结算
function generateSettleRouteByQiylx(enterpriseTypeName) {
    if (enterpriseTypeName) {
        const permissionStrList = chargeSettlePermissionsDict[enterpriseTypeName] as string[]
        if (permissionStrList?.length) {
            const cloneSettleRoute = cloneDeep(chargeSettleRoute)
            const calcChildren = getElevatorRoute(cloneSettleRoute.children, permissionStrList)
            const finalRoute = {
                ...cloneSettleRoute,
                children: calcChildren, // 重写子孙
                redirect: { name: calcChildren?.[0]?.children?.[0]?.name },
            }
            return finalRoute
        }
    }

    return null
}

function calcBussinessTypeList() {
    const userStore = useUserStoreWithOut()
    const bussinessTypeStr = userStore.getOrgInfo?.catTypeId ?? ''

    // filter(item => item) 是排除空字符串
    const bussinessTypeList = bussinessTypeStr.replace(/，/g, ',').split(',').filter(item => item).sort()
    return bussinessTypeList
}
function customSort(arr) {
    // 提取需要固定位置的元素
    const first = arr.includes('2') ? ['2'] : []
    const second = arr.includes('8') ? ['8'] : []

    // 过滤掉已固定的元素
    const others = arr.filter(item => item !== '2' && item !== '8')

    // 组合结果数组
    return [...first, ...second, ...others]
}
// 计算第一个有效路径, 根路由会跳转, 否则直接登出
export function calcFirstValidPath() {
    const { createMessage } = useMessage()

    const bussinessTypes = calcBussinessTypeList()
    let bussinessTypeList = bussinessTypes
    if (bussinessTypes.includes('2') || bussinessTypes.includes('8')) {
        bussinessTypeList = customSort(bussinessTypes)
    }

    if (bussinessTypeList.length) {
        const redirectPath = bussinessTypeEnum[bussinessTypeList[0]].path
        console.log('bussinessTypeList2', bussinessTypeList, redirectPath)
        return redirectPath
    }
    else {
        createMessage.error('无法匹配子应用路径, 正在登出')
        const userStore = useUserStoreWithOut()
        userStore.logout()
    }
}

export const fitOldPermissionsDict = {
    '施工单位': [
        '改造申请-增删',
        '改造申请-生成补贴申请',
        '改造申请-改查',
        '改造申请-意向登记',
        '改造申请-改造补录',
        '改造项目-查',
        '改造申请-补贴补录',
        '改造项目-增删改',
        '套餐设置-查',
        '套餐设置-增删改',
        '补贴申请-查看',
        '项目管理-查看',
        '合同管理-查看、下载',
    ],
    '物业公司': [
        '改造申请-增删',
        '改造申请-改查',
        '改造申请-编辑',
        '改造申请-删除',
        '改造申请-意向登记',
        '改造申请-改造补录',
        '改造申请-流程变更',
        '改造项目-查',
        '改造项目-增删改',
        '套餐设置-查',
        '套餐设置-增删改',
        '补贴申请-查看',
        '项目管理-查看',
        '合同管理-查看、下载',
        '企业上链-新增',
        '企业上链-编辑',
        '企业上链-查看',
    ],
    '物业联系人': [
        '改造申请-增删',
        '改造申请-改查',
        '改造申请-意向登记',
        '改造申请-改造补录',
        // '改造项目-查',
        // '套餐设置-查',
        '补贴申请-查看',
        // '项目管理-查看',
        // '合同管理-查看、下载',
    ],
    '社区': [
        '改造申请-改查',
        '补贴申请-查看',
        '补贴申请-审核',
    ],
    '行政区': [
        '改造申请-改查',
        '补贴申请-查看',
    ],
    '街道': [
        '补贴申请-查看',
        '补贴申请-审核',
    ],
    // 区住更局可补录已发放补贴的改造申请单数据，改造补录这块要考虑那些之前数据补贴已经下发了的，不需要再申请补贴申请，直接可以上传补贴发放凭证
    '市住更局(适老化)': [
        '改造申请-改查',
        '补贴申请-查看',
        '改造申请-改造补录',
        '改造申请-补贴补录',
        '统计报表',
        // '企业上链-查看',
        '企业上链-审批',
        '补贴券领取-查看',
        '补贴券发放-查看',
        '补贴券发放-新增',
    ],
}
export const financePermissionsDict = {
    金融机构: [
        '金融服务-申请列表',
    ],
}
export const chargeSettlePermissionsDict = {
    '运营商(清分业务)': [
        '结算日报表-列表',
        '充电站管理-列表',
        '充电账单记录-列表',
        '充电账单记录-导入',
        '结算设置-列表',
        '结算设置-表单',
        '结算单管理-列表',
        '结算单管理-表单',
        '对账单管理-列表',
        '对账单管理-表单',
    ],
    '设备商(清分业务)': [
        '结算单管理-列表',
        '结算单管理-表单',
        '对账单管理-列表',
        '对账单管理-表单',
    ],
}

export const cityServicePermissionsDict = {
    生活商城商家: [
        '商品列表-详情',
    ],
}

export const elevatorPermissionsDict = {
    '市住更局(电梯加装)': [
        /***
        * 上报需求列表
        */
        '需求上报-列表',
        '需求上报-查看',
        '需求上报-详情',
        /***
         * 身份比对失败失败列表
         */
        '身份失败-列表',
        '身份失败-详情',
        /***
         * 不在清册范围内列表(历史)
         */
        '不在清册范围内列表(历史)-列表',
        /***
         * 加装电梯列表
         */
        '加装申请-列表',
        /***
         * 加装历史数据列表
         */
        '历史数据-列表',
        '历史数据-详情',
        '历史数据-删除',
        /***
         * 区属数据列表
         */
        '区属数据-列表',
        /***
         * 清册数据列表
         */
        '清册数据-列表',
        '清册数据-楼栋维护',
        /**
         * 看板
         */
        '看板-各区申请',
        '看板-加梯地图',
        '看板-大屏',
    ],
    '区住更局(电梯加装)': [
        /***
         * 上报需求列表
         */
        '需求上报-列表',
        '需求上报-查看',
        '需求上报-详情',
        /***
         * 身份比对失败失败列表
         */
        '身份失败-列表',
        '身份失败-详情',
        /***
         * 不在清册范围内列表(历史)
         */
        '不在清册范围内列表(历史)-列表',
        /***
         * 加装电梯列表
         */
        '加装申请-列表',
        /***
         * 加装历史数据列表
         */
        '历史数据-列表',
        '历史数据-补录',
        '历史数据-编辑',
        '历史数据-详情',
        /***
         * 区属数据列表
         */
        '区属数据-列表',
        /***
         * 清册数据列表
         */
        '清册数据-列表',
        '清册数据-新增',
        '清册数据-楼栋维护',
        '清册数据-核实',
        /***
        * 看板
        */
        '看板-各区申请',
        '看板-加梯地图',
        '看板-大屏',
    ],
    '街道(电梯加装)': [
        /***
        * 上报需求列表
        */
        '需求上报-列表',
        '需求上报-处理',
        '需求上报-详情',
        /***
        * 加装电梯列表
        */
        '加装申请-列表',
        '加装申请-处理',
        '加装申请-加梯数量',
        /***
        * 加装历史数据列表
        */
        '历史数据-列表',
        '历史数据-编辑',
        '历史数据-补录',
        '历史数据-详情',
        /***
        * 看板
        */
        '看板-加梯地图',
    ],
    '信息中心(电梯加装)': [
        /***
        * 上报需求列表
        */
        '需求上报-列表',
        '需求上报-查看',
        '需求上报-详情',
        /***
        * 身份比对失败失败列表
        */
        '身份失败-列表',
        '身份失败-详情',
        '身份失败-审核',
        '身份失败-修改',
        /***
        * 不在清册范围内列表(历史)
        */
        '不在清册范围内列表(历史)-列表',
        /***
        * 加装电梯列表
        */
        '加装申请-列表',
        /***
        * 加装历史数据列表
        */
        '历史数据-列表',
        '历史数据-详情',
        /***
        * 区属数据列表
        */
        '区属数据-列表',
        '区属数据-新增',
        /***
        * 清册数据列表
        */
        '清册数据-列表',
        '清册数据-新增',
        '清册数据-编辑',
        '清册数据-核实',
        '清册数据-楼栋维护',
        '清册数据-新增楼栋',
        '清册数据-导入单元',
        '清册数据-小区导出',
        '清册数据-楼栋清册导出',
        /***
        * 看板
        */
        '看板-各区申请',
        '看板-加梯地图',
        '看板-大屏',
    ],
    '专班审核(电梯加装)': [
        /***
        * 上报需求列表
        */
        '需求上报-列表',
        '需求上报-查看',
        '需求上报-详情',
        /***
        * 身份比对失败失败列表
        */
        '身份失败-列表',
        '身份失败-详情',
        /***
        * 不在清册范围内列表(历史)
        */
        '不在清册范围内列表(历史)-列表',
        /***
        * 加装电梯列表
        */
        '加装申请-列表',
        /***
        * 加装历史数据列表
        */
        '历史数据-列表',
        '历史数据-详情',
        /***
        * 区属数据列表
        */
        '区属数据-列表',
        /***
        * 清册数据列表
        */
        '清册数据-楼栋维护',
        '清册数据-列表',
        /***
        * 看板
        */
        '看板-各区申请',
        '看板-加梯地图',
        '看板-大屏',
    ],
}

export const areaElevatorPermissionsDict = {
    '市住更局(电梯加装)': [
        /***
        * 上报需求列表
        */
        '需求上报-列表',
        '需求上报-查看',
        '需求上报-详情',
        /***
         * 身份比对失败失败列表
         */
        '身份失败-列表',
        '身份失败-详情',
        /***
         * 加装电梯列表
         */
        '加装申请-列表',
        /***
         * 加装历史数据列表
         */
        '历史数据-列表',
        '历史数据-详情',
        '历史数据-删除',
        /***
         * 区属数据列表
         */
        '区属数据-列表',
        /***
         * 清册数据列表
         */
        '清册数据-列表',
        '清册数据-楼栋维护',
    ],
    '街道(电梯加装)': [
        /***
        * 上报需求列表
        */
        '需求上报-列表',
        '需求上报-处理',
        '需求上报-详情',
        /***
        * 加装电梯列表
        */
        '加装申请-列表',
        '加装申请-处理',
        '加装申请-加梯数量',
        /***
        * 加装历史数据列表
        */
        '历史数据-列表',
        '历史数据-编辑',
        '历史数据-补录',
        '历史数据-详情',
    ],
    '信息中心(电梯加装)': [
        /***
        * 上报需求列表
        */
        '需求上报-列表',
        '需求上报-查看',
        '需求上报-详情',
        /***
        * 身份比对失败失败列表
        */
        '身份失败-列表',
        '身份失败-详情',
        '身份失败-审核',
        '身份失败-修改',
        /***
        * 加装电梯列表
        */
        '加装申请-列表',
        /***
        * 加装历史数据列表
        */
        '历史数据-列表',
        '历史数据-详情',
        /***
        * 区属数据列表
        */
        '区属数据-列表',
        '区属数据-新增',
        /***
        * 清册数据列表
        */
        '清册数据-列表',
        '清册数据-新增',
        '清册数据-编辑',
        '清册数据-核实',
        '清册数据-楼栋维护',
        '清册数据-新增楼栋',
        '清册数据-小区导出',
        '清册数据-楼栋清册导出',
    ],
    '专班审核(电梯加装)': [
        /***
        * 上报需求列表
        */
        '需求上报-列表',
        '需求上报-查看',
        '需求上报-详情',
        /***
        * 身份比对失败失败列表
        */
        '身份失败-列表',
        '身份失败-详情',
        /***
        * 加装电梯列表
        */
        '加装申请-列表',
        /***
        * 加装历史数据列表
        */
        '历史数据-列表',
        '历史数据-详情',
        /***
        * 区属数据列表
        */
        '区属数据-列表',
        /***
        * 清册数据列表
        */
        '清册数据-楼栋维护',
        '清册数据-列表',
    ],
}
